package top.milkbox.core;


import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * 关于javaweb文件下载的相关工具
 * @author milkbox
 * @version 2021-9-12
 */
public class UtilsDownload {

    // 声明utf-8的常量，在此类中使用UTF_8参数代替，相当关于是"utf-8"
    private static final String UTF_8 = StandardCharsets.UTF_8.toString();

    /**
     * 根据agent中的浏览器标识，来根据不同浏览器对filename进行编码
     * 以防止中文文件名乱码
     * <p>
     * 注意区分jdk版本
     * <p>
     * 来自互联网并由xiaoguo修改了火狐编码的部分
     *
     * @param agent    通过请求头中的user-agent属性来传入，即直接传入user-agent属性值即可
     * @param filename 要编码的文件名
     * @return 返回编码后的文件名
     * @throws UnsupportedEncodingException 抛出异常
     */
    public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
        if (agent.contains("MSIE")) {
            // IE浏览器
            filename = URLEncoder.encode(filename, UTF_8);
            filename = filename.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐浏览器
            Base64.Encoder base64Encoder = Base64.getEncoder(); // 通过Base64的静态方法获取一个编码器
            // 火狐的格式，“?使用的编码?B?文件名字符串?=”
            filename = "=?utf-8?B?" +
                    base64Encoder.encodeToString(filename.getBytes(UTF_8)) +
                    "?=";
            // 若是在java8之前的jdk版本就使用如下的方式
            // BASE64Encoder base64Encoder = new BASE64Encoder();
            // filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filename = URLEncoder.encode(filename, UTF_8);
        }

        return filename;
    }
}
